package com.jboltai.capability;


import com.alibaba.fastjson.JSON;

/**
 * 模版字符串常量
 */
public class Templates {


//    public static final String FUNCTION_CALL_TPL = "你是一个语义专家，现在请你解析识别并理解用户提供的指令的语义并从给定的Functions清单中按照语义匹配到最符合调用的Function。如果用户的指令不是调用Function相关内容，则直接返回JSON字符串:{\"function\": null},不要输出其它任何解释性内容;\n" +
//            "请严格遵守以下语义识别和匹配要求和条件：\n" +
//            "1、用户指令表达出的语义和Function相匹配，并且对应Function的参数required是true的情况下，用户的指令中必须能解析出相应参数，才算匹配\n" +
//            "2、如果没有语义合适相匹配的Function，则直接返回JSON字符串返回{\"function\": null},不要输出其它任何解释性内容\n" +
//            "匹配到Function的返回内容格式限定：\n" +
//            "1、你回答中只输出json:{\"function\":\"function的name值\",\"parameters\":{\"参数名(是在functions清单中parameters下的properties中声明的属性名)\":\"解析到的参数值\"}}，json中包含选中的Function的name、parameters两个属性\n" +
//            "2、parameters参数中的具体参数的名字必须与Functions描述文档中对应接口定义的参数的name值保持一致\n" +
//            "3、parameters参数中的具体参数值如果用户指令中没有对应内容，则参数设置参考这个json格式:{\"参数名\":null}\n" +
//            "4、不要输出任何与JSON格式无关的任何内容,不要输出其它任何解释性内容;\n"+
//            "匹配不到Function的返回内容格式限定：\n" +
//            "1、匹配不到合适的function，必须且只返回json格式字符串:{\"function\": null},不要输出其它任何解释性内容\n"+
//            "\n" +
//            "以下是Functions清单：'''{}'''\n" +
//            "\n" +
//            "以下是用户的指令：'''{}'''\n"+
//            "你回答中只保留json内容;";

    /**
     * function call模版
     */
    public static final String FUNCTION_CALL_TPL = "# 角色\n" +
            "你是一个专业函数语义解析器。\n" +
            "# 你的任务是:\n" +
            "1. 分析用户指令的语义意图\n" +
            "2. 在给定的Functions清单中找到最匹配的函数\n" +
            "3. 解析提取用户指令中的相关参数值\n" +
            "4. 按指定JSON格式返回最终结果\n" +
            "\n" +
            "# 函数匹配规则(按优先级排序):\n" +
            "1. 指令的核心语义必须与函数的功能描述高度匹配\n" +
            "2. 所有required=true的参数必须能从指令中提取出有效值,如果指令中没有但是设置了默认值defaultValue就需要使用默认值\n" +
            "3. 函数的参数类型需与指令中提取的值类型一致\n" +
            "4. 在多个候选函数时,优先选择参数匹配度最高的\n" +
            "\n" +
            "# 参数提取规则:\n" +
            "1. 字符串类型: 提取指令中的相关文本片段\n" +
            "2. 数字类型: 提取并转换为对应数值\n" +
            "3. 布尔类型: 基于指令的明确或隐含表达转换\n" +
            "4. 数组类型: 识别并提取所有相关元素\n" +
            "5. 对象类型: 按对象结构提取对应属性值\n" +
            "6. 提取不到具体指的参数，如果设置了默认值defaultValue就需要使用默认值" +
            "\n" +
            "# 输出内容格式规定:\n" +
            "- 1. 匹配成功时:\n" +
            "{\n" +
            "  \"function\": \"functionName\",\n" +
            "  \"parameters\": {\n" +
            "    \"paramName1\": extractedValue1,\n" +
            "    \"paramName2\": extractedValue2,\n" +
            "    ...\n" +
            "  }\n" +
            "}\n" +
            "\n" +
            "- 2. 匹配失败时:\n" +
            "{\n" +
            "  \"function\": null\n" +
            "}\n" +
            "\n" +
            "# 注意:\n" +
            "- 仅返回JSON格式数据,不包含任何其他内容\n" +
            "- 未能提取的参数值设为null，如果设置了默认值defaultValue就需要使用默认值\n" +
            "- 如无合适匹配函数,返回null\n" +
            "\n" +
            "# Functions清单:\n" +
            "'''{}'''\n" +
            "\n" +
            "# 用户指令:\n" +
            "'''{}'''";


    /**
     * 调用function call的模板
     */
    public static final String CHAT_WITH_FUNCTION_CALL =
            "# 角色\n" +
                    "你是一个数据和返回值分析处理专家.\n" +
                    "# 你的任务\n" +
                    "请结合我提供给你的[执行的业务描述]和[业务执行返回的结果数据]，仔细思考分析用户提出的问题后回答.\n" +
                    "# 执行的业务描述如下:\n" +
                    "```\"{}\";业务执行返回的结果数据如下: \"[{}\"];根据[执行的业务描述]分析[业务执行返回的结果数据]，从[业务执行返回的结果数据如下]中识别提取需要的数据.```;\n" +
                    "# 用户提出的问题是:\n" +
                    "```{};\n" +
                    "回答内容言简意赅,将结果按照要求输出给用户，不要输出结果以外的信息，比如`根据提供的信息`，`根据数据` 这种助语都不要输出;\n" +
                    "{},请一步一步思考后回答,不要输出任何思考过程。\n" +
                    "```\n"
            ;

//    /**
//     * 仅根据知识库回答的模版
//     */
//    public static final String CHAT_WITH_KNOWLEDGE_ONLY = "请根据用户的提问，按照以下要求，从提供的背景知识以及对话上下文中提取相关信息，整理成答案输出给用户。\n" +
//            "背景知识如下：```{}```\n" +
//            "用户的问题是:```{}```" +
//            "输出要求如下：\n" +
//            "1. 请优先使用背景知识中的内容回答用户的问题，答案应与背景知识严格一致，不可以胡乱编造。\n" +
//            "2. 背景知识中的文字如果插入了图片、视频、音频、文件等HTML标签，要一同被采用。\n" +
//            "3. 对话上下文中的内容作为次要知识来源。”\n" +
//            "4. 如果背景知识和上下文内容都无法回答用户问题，请直接回复`抱歉，我无法回答您的问题。`。\n" +
//            "5. 整理的答案要条理清晰、内容详实。\n" +
//            "6. 请使用markdown格式输出答案(如果是video,audio,img,a标签,请不要转为markdown格式)。\n\n";
////            "7. 内容中如果包含图片、视频、音频、文件等HTML标签，要保留并输出。";
//
//
//    /**
//     * 根据知识库回答的模版
//     */
//    public static final String CHAT_WITH_KNOWLEDGE = "请根据用户的提问，按照以下要求，从提供的背景知识以及对话上下文中提取相关信息，整理成答案输出给用户。\n" +
//            "背景知识如下：```{}```\n" +
//            "用户的问题是:```{}```" +
//            "输出要求如下：\n" +
//            "1. 请优先使用背景知识中的内容回答用户的问题，答案应与背景知识严格一致，不可以胡乱编造。\n" +
//            "2. 背景知识中的文字如果插入了图片、视频、音频、文件等HTML标签，要一同被采用。\n" +
//            "3. 对话上下文中的内容作为次要知识来源。”\n" +
//            "4. 如果背景知识和上下文内容都无法回答用户问题，请忽略1、2、3要求，直接调用你作为通用大模型的能力，对问题进行解答。\n" +
//            "5. 整理的答案要条理清晰、内容详实。\n" +
//            "6. 请使用markdown格式输出答案(如果是video,audio,img,a标签,请不要转为markdown格式)。\n\n";
////            "7. 内容中如果包含图片、视频、音频、文件等HTML标签，要保留并输出。";

    /**
     * 仅根据知识库回答的模版
     */
    public static final String CHAT_WITH_KNOWLEDGE_ONLY = "请根据用户的提问，严格按照回答和内容输出要求，依据背景知识中的相关内容回答问题。\n" +
            "# 背景知识如下:\n" +
            "```{background}```\n" +
            "# 用户的提问是:\n" +
            "```{question}```\n"+
            "# 必须严格遵守以下的回答和内容输出要求并严格执行:\n" +
            "- 1. 你只能使用背景知识中存在的内容回答问题，不存在的内容一定不要输出;使用背景知识中包含的的文本、图片URL、视频URL、音频URL、附件URL、相对路径地址、其它超链接URL地址等内容回答用户的问题，回答内容与背景知识保持一致;\n"+
            "- 2. 回答内容中如果存在相关图片视频音频附件和超链接等链接地址或者相对路径地址，一并全量携带输出，这些链接地址保持原样输出，切勿擅自修改地址内容，不要忽略，内容直接从背景知识里找原文，不要输出不存在的解释性的内容;\n"+
            "- 3. 背景知识中的所有相对路径url地址，都要按照正常URL地址方式去输出；但是一定不要输出背景知识内容里不包含的任何图片和超链接URL地址;\n"+
            "- 4. 如果背景知识和上下文内容都无法回答用户问题，用户提问内容与背景知识内容无关，那么必须直接回复:`{nomatch}`,不允许输出其他解释和说明;举个例子:如果你的背景知识内容都是关于电商客服业务的，但是用户提问让你写一首诗，这种类似的情况，必须直接输出:{nomatch};\n" +
            "- 5. 如果用户提问内容是语气词、问候语、客气语等内容，就不要使用知识库中任何内容回答，直接模拟自然对话简单回复即可;\n"+
            "- 6. 最终回复内容要以更符合人阅读习惯格式排版的markdown格式输出,条理清晰,重点说明的内容要加粗格式,使用到的相关图片URL、视频URL、音频URL、附件URL、其它超链接URL地址以及一些是图片视频音频附件和超链接的相对路径格式的URL地址等都必须保持原样输出，且链接地址原文不做任何改动保持原样;\n" +
            "- 7. 不要以:'根据背景知识'这样的开头内容回答;"+
            "- 8. 请一步接一步地仔细思考后精准回答,不要输出思考过程;";



    /**
     * 根据知识库回答的模版
     */
    public static final String CHAT_WITH_KNOWLEDGE = "请根据用户的提问，严格按照回答和内容输出要求，依据背景知识中的相关内容回答问题。\n" +
            "# 背景知识如下:\n" +
            "```{background}```\n" +
            "# 用户的提问是:\n" +
            "```{question}```\n"+
            "# 必须严格遵守以下的回答和内容输出要求并严格执行:\n" +
            "- 1. 你只能使用背景知识中存在的内容回答问题，不存在的内容一定不要输出;使用背景知识中包含的的文本、图片URL、视频URL、音频URL、附件URL、相对路径地址、其它超链接URL地址等内容回答用户的问题，回答内容与背景知识保持一致;\n"+
            "- 2. 回答内容中如果存在相关图片视频音频附件和超链接等链接地址或者相对路径地址，一并全量携带输出，这些链接地址保持原样输出，markdown格式渲染出来，切勿擅自修改地址内容，不要忽略，内容直接从背景知识里找原文，不要输出过多不存在的解释性的内容;\n"+
            "- 3. 背景知识中的所有相对路径url地址，都要按照正常URL地址方式去输出；但是一定不要输出背景知识内容里不包含的任何图片和超链接URL地址;\n"+
            "- 4. 如果背景知识和上下文内容都无法回答用户问题，请直接调用你作为通用大模型的能力进行回答，举个例子：比如你的角色是一个电商客服，用户提问李白是哪个朝代的诗人，你要直接回复`李白是唐朝的诗人`;\n" +
            "- 5. 如果用户提问内容是语气词、问候语、客气语等内容，就不要使用知识库中任何内容回答，直接模拟自然对话简单回复即可;\n"+
            "- 6. 最终回复内容要以更符合人阅读习惯格式排版的markdown格式输出,条理清晰,重点说明的内容要加粗格式,使用到的相关图片URL、视频URL、音频URL、附件URL、其它超链接URL地址以及一些是图片视频音频附件和超链接的相对路径格式的URL地址等都必须保持原样输出，且链接地址原文不做任何改动保持原样;\n" +
            "- 7. 不要以:'根据背景知识'这样的开头内容回答;"+
            "- 8. 请一步接一步地仔细思考后精准回答,不要输出思考过程;";
    /**
     * 根据内容生成sql语句
     */
    public static final String TEXT_TO_SQL =
            "# 角色\n" +
                    "你充当一个数据库Sql生成器." +
                    "# 你的任务职责是:\n" +
                    "按照将[用户需求]依据[相关背景知识]执行生成并输出Sql.\n" +
                    "# 以下是数据库和数据表相关背景知识：\n" +
                    "```{}```;\n" +
                    "# 以下是用户的需求是：\n" +
                    "```{}```;\n"+
                    "# 生成Sql的规则和要求如下:\n"+
                    "- 1.根据提供的背景知识，将用户的需求转为Sql语句;\n" +
                    "- 2.Sql语句必须符合{}的标准;\n" +
                    "# 输出Sql结果要求如下:\n"+
                    "- 1.你不要做任何假设，不要有任何额外解释;请一步一步仔细思考后执行并精准输出。\n" +
                    "- 2.必须保证sql是安全的，没有注入风险的。\n" +
                    "- 3.直接给出最终Sql，不需要任何其他说明，不要使用markdown格式进行包装;\n";



    /**
     * 根据内容生成json结构数据
     */
    public static final String TEXT_TO_JSON = "请你充当一个JSON格式数据生成器、非结构化数据转JSON格式数据转换器，将我提供的[原始数据]按照[指定转换成的JSON数据格式说明信息]进行转换，生成并输出符合这个JSON格式要求的数据，请一步一步仔细思考后执行并精准回答，你不要做任何假设，不要输出任何思考过程，你最终只输出解析到的和转换后的JSON数据内容，不要输出任何跟JSON无关的内容，如果无法转换成JSON就仅返回一个指定字符串:null：\n" +
            "# 背景知识如下：\n" +
            "```{}```;\n" +
            "# 转换成的JSON数据格式说明如下：\n" +
            "```{}```;\n"+
            "# 原始数据和其它转换生成要求如下：\n" +
            "```{}```;\n";
    ;


    public static final String INTENTION_RECOGNIZE_TPL = "请你充当一位语义解析专家，我将提供以下几个问题的分类，请你仔细谨慎得解析用户的提问，按照我提供的分类判断用户的提问属于哪个分类，然后将匹配到的分类的json中的key直接返回，如果未匹配到任何分类，请直接返回null。不要回答任何其他解释性的内容和文字。\n" +
            "# 分类如下：\n" +
            "\n{}\n。" +
            "# 用户的提问内容是：\n" +
            "{}";


    public static final String PROMPT_REWRITE_TPL="# 角色\n\n" +
            "你是一个语言学专家，精通遣词造句，阅读理解，语法纠正，语义完整性校验，擅长根据上下文将用户提出的问题进行语义补全。\n\n" +
            "# 输入内容包括：\n" +
            "## 1. [一组对话历史信息]：\n\n" +
            "{}\n\n" +
            "## 2. [用户最新提问内容]：\n\n" +
            "{}\n\n" +
            "# 输出内容格式要求(必须严格遵守):\n\n" +
            "完整提问:[完整提问内容]\n\n" +
            "# 你的任务是:\n\n" +
            "因为我需要使用[用户最新提问内容]去向量数据库中进行语义向量检索数据，所以[用户最新提问内容]必须是一个尽量能表述完整语义提问和查询意图的句子。所以需要你根据我提供的[一组对话历史信息]作为前提，去判断[用户最新提问内容]是否已经完整表达出用户的提问和查询意图，请严格按照以下的规则去执行：\n\n" +
            "- 1. 如果[用户最新提问内容]表达语义提问和查询意图比较完整就不做任何变动修改优化和说明，[完整提问内容]的值设置为与[用户最新提问内容]的值完全相等。\n\n" +
            "- 2. 如果[用户最新提问内容]表达语义提问和查询意图不完整，那么就请参考我提供的[一组对话历史信息]的上下文内容对[用户最新提问内容]进行句子语法补全和语义完整化优化补全处理，将处理后的一个完整的新的用户问题句子赋值给[完整提问内容]。\n\n" +
            "- 3. 如果[用户最新提问内容]表达的语义并不是查询检索新内容的意图，而是就提供的[一组对话历史信息]的内容做某个操作处理（例如：做个对比、做个表格展示、做个思维导图表示、对比分析一下等），这时候需要你结合提供的[一组对话历史信息]和[用户最新提问内容]最终分析理解判断并描述出用户要对具体的哪些对象、事项、目标、数据、内容等做出什么样操作，以此重新构建出一个新的用户提问句子并将其赋值给[完整提问内容]。\n\n" +
            "- 4. 请一步一步仔细思考并处理，不要输出其它任何解释性内容。";
    /*public static final String PROMPT_REWRITE_TPL = "作为一个对话辅助系统，你的任务是:\n" +
            "\n" +
            "1. 分析用户的最新提问和历史对话内容\n" +
            "2. 识别以下关键要素:\n" +
            "   A. 主要讨论对象(例如:项目名称、地点、产品等)\n" +
            "   B. 历史对话中提到的所有评估维度(例如:价格、位置、空间、时间、难度等等)\n" +
            "   C. 用户关注的具体指标(例如:具体价格区间、距离要求等)\n" +
            "   D. 历史讨论中涉及的功能特性\n" +
            "   E. 相关的量化指标" +
            "3. 重构提问:\n" +
            "   - 保留用户最新提问的核心意图\n" +
            "   - 只补充和最新提问相关的上下文信息\n" +
            "   - 将历史对话中提到的所有评估维度明确列举\n" +
            "   - 具体化比较的参数和指标\n" +
            "   - 使用枚举方式列出关键评估点\n" +
            "   - 加入历史对话中提到的具体数据和标准\n" +
            "\n" +
//            "规则：\n" +
//            "- 仅返回最终的重构的详细问题，不包含任何其他内容\n" +
            "\n" +
            "输入格式：\n" +
            "历史对话：\n{}\n" +
            "最新提问：{}\n" +
            "\n" +
            "输出格式：\n" +
            "1. 信息提取：\n" +
            "   - 核心对象：[列出讨论的主体]\n" +
            "   - 评估维度：[从历史对话中提取的所有评估维度]\n" +
            "   - 关键指标：[相关的具体数据和标准]\n" +
            "   - 特殊要求：[用户特别关注的点]\n" +
            "\n" +
            "2. 完整提问：[重构后的详细问题]";
*/



}
